-- memory_clear
-- create by zhuangsl
-- 技能：全场怪物清除特性（对无生命敌人无效，学习工程学手册知识点后起效）

return {
    apply = function(source, target, skillId, round, para, extra)
        -- 遍历所有的怪
        local ret = {};

        for p = 1, DUNGEON_WIDTH * DUNGEON_HEIGHT do
            local grid = DungeonM.getGridByPos(p);

            -- 是未死亡的怪物
            if  grid:isOpened() and
                grid:isMonster() and
                not grid.monster:isDead() then
                table.insert(ret, grid.monster);
            end
        end

        -- 是否对非生命怪物起效
        local livingOnly = true;
        if EngineeringManualM.checkIsLearn(para) then
            livingOnly = false;
        end

        for _, monster in pairs(ret) do
            -- 对BOSS和史莱姆怪无效
            -- 未学习工程学手册指定学科时只对有生命的怪物起效
            if not monster:isBoss() and monster:query("monster_type") ~= MONSTER_TYPE_SLIME and
                (not livingOnly or FormulaM.invoke("IS_LIVING_TARGET", monster)) then
                if monster:isRemoteMonster() then
                    -- 远程怪设置不守护格子
                    monster.dbase:set("remote_can_not_lock", 1);

                    -- 事件
                    EventMgr.fire(event.CLEAR_FEATURE, {["pos"] = monster:getPos(), });
                end

                -- 清空特性
                PropM.deleteProp(monster, "skill", false);

                -- 闪避特性单独处理
                if monster.dbase:query("dodge", 0) > 0 then
                    monster.dbase:set("dodge", 0);
                end

                -- 增加命中动作
                if SkillM.getSequence(monster) == nil then
                    SkillM.getSequenceList()[monster] = CastSequence.create(source, monster, skillId);
                end

                SkillM.getSequence(monster):hit(source, monster, skillId);
            end
        end

        -- 作用目标
        return ret;
    end,

    parse = function(desc)
        local arr = string.explode(desc, ",");
        return tonumber(arr[1]);
    end,

    -- 解析技能描述
    parseDesc = function(source, skillId, desc, para)
        -- 不需要解析
        return desc;
    end,
};
